/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.geradormvc.funcoes;

import br.com.geradormvc.excessao.GeradorMVCException;
import br.com.geradormvc.modelo.dominio.Principal;
import br.com.geradormvc.modelo.dominio.TabelaSelecionada;
import com.sun.org.apache.xerces.internal.impl.xs.identity.Selector.Matcher;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.util.Iterator;
import java.util.List;
import java.lang.String;
import java.util.regex.Pattern;

/**
 *
 * @author douglas
 */
public class GeraClasseDominio {

    private String nomeDoArquivo;
    private Principal principal;
    private List dadosTabela;

    public GeraClasseDominio(List dadosTabela, Principal principal) {
        this.principal = new Principal();
        this.principal = principal;
        this.dadosTabela = dadosTabela;
        this.nomeDoArquivo = principal.getNomeClasse() + ".java";
    }

    public void inserirDados() throws GeradorMVCException {

        File fArquivo = null;

        try {
            fArquivo = new File(this.nomeDoArquivo);
            FileWriter fwArquivo = null;
            // Verifica se o arquivo existe
            // Se existir, ele abre par adicionar dados
            // se nao existir, ele cria o arquivo
            if (fArquivo.exists() == true) {
                fwArquivo = new FileWriter(fArquivo, true);

            } else {
                fwArquivo = new FileWriter(fArquivo);
            }
            BufferedWriter bw = new BufferedWriter(fwArquivo);

            //Escrevendo a cabeça da classe Modelo;

            bw.write("/*" + "\n");
            bw.write("* Esta classe foi gerada pelo Gerador MVC" + "\n");
            bw.write("* Autor: Douglas Bertachini" + "\n");
            bw.write("*/ "+ "\n");
            bw.write("package br.com.geradormvc.modelo.dominio;");
            bw.write("import"  + " br.com."+ principal.getNomeProjeto() +".excessao." + principal.getNomeProjeto() + "Exception;");
            bw.write("public class" + principal.getNomeClasse() + "{ \n\n");

            Iterator resultado = dadosTabela.iterator();

            while (resultado.hasNext()) {
                TabelaSelecionada tabela = (TabelaSelecionada) resultado.next();
                bw.write("     private" + capitalize(tabela.getTipoAtributo()) + tabela.getNomeAtributo() + ";\n");
            }

            while (resultado.hasNext()) {
                TabelaSelecionada tabela = (TabelaSelecionada) resultado.next();
                
                bw.write("     public " + capitalize(tabela.getTipoAtributo()) + " get" +  capitalize(tabela.getNomeAtributo())  + "() {\n");
                bw.write("          return " + capitalize(tabela.getNomeAtributo()) + ";\n");
                bw.write("}\n");
                bw.write("\n");

                if (tabela.getAceitaNulo()) {

                    bw.write("     public void set" + capitalize(tabela.getNomeAtributo()) + "(" + capitalize(tabela.getTipoAtributo()) + " " + capitalize(tabela.getNomeAtributo())+") {\n");
                    bw.write("          this." + capitalize(tabela.getNomeAtributo()) + ";\n");
                    bw.write("     }\n");
                    bw.write("\n");

                } else {

                    bw.write("     public void set" + capitalize(tabela.getNomeAtributo()) + "(" + capitalize(tabela.getTipoAtributo()) + " " + capitalize(tabela.getNomeAtributo())+") throws " + principal.getNomeProjeto() + "Exception {\n");
                    bw.write("          this." + capitalize(tabela.getNomeAtributo()) + ";\n");
                    bw.write("          if (!this.is" + capitalize(tabela.getNomeAtributo()) + "Valido(" + capitalize(tabela.getNomeAtributo()) + ".trim())) {\n");
                    bw.write("              throw new " + principal.getNomeProjeto() + "Exception(\"O campo " + capitalize(tabela.getNomeAtributo()) + " deve ser informado!\");\n");
                    bw.write("          }");
                    bw.write("     }\n");
                    bw.write("\n");

                    bw.write("     public boolean is" + capitalize(tabela.getNomeAtributo()) + "(" + capitalize(tabela.getTipoAtributo()) + " " + capitalize(tabela.getNomeAtributo()) + ") {\n");
                    bw.write("          if (" + capitalize(tabela.getNomeAtributo()) + " == null || " + capitalize(tabela.getNomeAtributo()) + ".lenght() == 0 ) {\n");
                    bw.write("              return false;\n");
                    bw.write("          } else {\n");
                    bw.write("              return true;\n");
                    bw.write("          }\n");
                    bw.write("     }\n");
                }

            }
            bw.write("}");
            //fecha o arquivo
            bw.close();
            fwArquivo.close();

        } catch (Exception exc) {
            StringBuilder mensagem = new StringBuilder("Erro ao inserir linhas no arquivo:.");
            mensagem.append("\nMotivo: ").append(exc.getMessage());
            throw new GeradorMVCException(mensagem.toString());

        }

    }

public static String capitalize(String content) {
    Pattern capitalize = Pattern.compile("([\\?!\\.]\\s*)([a-z])");
        java.util.regex.Matcher m = capitalize.matcher(content);
    while (m.find()) {
        content = m.replaceFirst(m.group(1) + m.group(2).toUpperCase());
        m = capitalize.matcher(content);
    }

    // Capitalize the first letter of the string.
    content = String.format("%s%s", Character.toUpperCase(content.charAt(0)), content.substring(1));

    return content;
}



}
